package com.tedu.API.list;

import org.junit.Test;

import java.util.*;

/** Collection集合下   子集合【叫队列】  包位置: java.util
 *  Queue    队列    单端队列
 *  Deque    队列    双端队列  "Deque接口---继承---Queue接口"
 *  作用: 保存数据，有序存储和处理，功能: 数据缓冲或者多线程协调工作!
 *
 *  队列实现类:
 *  LinkedList: 双向链表
 */
public class QueueAPI {
    //Queue   队列    单端队列
    @Test
    public void testQueue(){
        //创建队列---使用多态---LinkedList
        Queue<String> queue=new LinkedList<>();
        /**
         * offer() ---add()  一样
         * 作用: 入队操作，对尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("罗生门");
        queue.offer("临安小记");
        queue.offer("一载百味");
        System.out.println("Queue队列: "+queue);

        /**
         * poll()
         * 作用: 出队操作，获取队首元素，并且删除队列中队首
         * peek()
         * 作用:出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll();  queue.poll(); //删除队首元素
        System.out.println("Queue队列: "+queue);
        String str= queue.peek();
        System.out.println("队首元素： "+str);
        System.out.println("Queue队列: "+queue);

        /**
         * 需求: 1.遍历队列---while---只遍历一次【队列元素消失】
         *      提示: while的条件: 拿到队列中总长度 size()>0
         * 需求: 2.遍历队列---增强for---队列元素不消失
         *      提示: for 条件: E e:队列
         */
        //1.遍历队列---while---只遍历一次【队列元素消失】
        //    提示: while的条件: 拿到队列中总长度 size()>0
       // while (queue.size()>0){  //true: 队列总数>0
         //   str= queue.poll();  //获取队首，删除队首
         //  System.out.println("获取队列元素: "+str);
       // }
          // System.out.println("Queue队列元素: "+queue);

        //2.遍历队列---增强for---队列元素不消失
        //    提示: for 条件: E e:队列   数组引用/集合泛型: 数组引用/集合引用
        for (String e:queue){
            System.out.println("队列元素: "+e);
        }
        System.out.println("Queue队列: "+queue);
    }

    //Deque   队列   双端队列---继承---单端队列
    @Test
    public void testDeque(){
        //创建Deque  双端队列   方法基本一致，部分方法不一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("夙音国主");  deque.offer("新风");
        deque.offer("夏皎"); deque.offer("吉利虾");
        System.out.println("双端队列: "+deque);

        //offerFirst()  队首添加元素 OfferLast()  队尾添加元素
        deque.offerFirst("魏川"); deque.offerLast("陈豆");
        System.out.println("双端队列[首尾添加元素]: "+deque);

        //getFirst 获取队首     getLast 获取队尾
        System.out.println("获取队列中队首: "+deque.getFirst());
        System.out.println("获取队列中队尾: "+deque.getLast());

        //pollFirst() 获取队首，删除队列中队首 【单端: poll类型】
        //pollLast() 获取队尾，删除队列中队尾
        String wei=deque.pollLast();  //删除"陈豆"元素   队列---队首
        System.out.println("队尾元素: "+wei);
        System.out.println("双端队列: "+deque);
    }

    /**
     * 栈结构: 业务中如果有后退【撤销】情况使用
     * 双端队列支持栈结构---提供相应的方法实现栈结构
     */
    @Test
    public void testStack(){
        //创建双端队列
        Deque<String> stack=new LinkedList<>();
        /**
         * push() Deque 独有方法--支持栈结构
         *    ---offer: Queue---add: Collection接口   【添加】
         * 作用: 【添加: 往栈压入一个元素】 压栈操作
         */
        stack.push("雪中悍刀行");
        stack.push("庆余年");
        stack.push("叶罗丽精灵梦");
        stack.push("山河剑心");
        System.out.println("栈结构: "+stack);

        /**
         * pop() 出栈一个尾元素  --pollLast类似【拿先入后出，最后一个压栈元素】
         */
        String last=stack.pop();
        System.out.println("出栈伪元素: "+last);
        System.out.println("栈结构: "+stack);
        //面试题: pop、poll、peek的使用区别:
        /**
         * 1.pop():  出栈尾元素，用于stack类
         *           类似于poll，【拿先入后出，最后一个压栈元素】
         * 2.poll(): 出队操作，获取队首元素，并且删除队列中队首
         *           队列为空，则返回null
         * 3.peek(): 出队操作，获取队首元素，不删除队列中队首
         *           队列为空，则返回null
         */

        /**
         * 需求: 1.遍历栈结构---while---元素出栈，队列元素需要清空
         * 需求: 2.遍历栈结构---增强for---元素遍历成功，队列元素不变
         */
        //需求: 1.遍历栈结构---while---元素出栈，队列元素需要清空
      // while (stack.isEmpty()){
       //    String a=stack.pop();
       //    System.out.println(a);
     //  }
      //  System.out.println("清空队列元素后输出: "+stack.size());

       //需求: 2.遍历栈结构---增强for---元素遍历成功，队列元素不变
        for (String a:stack) {
            System.out.println("输出: " + a);
        System.out.println("输出: "+stack);
    }
}
}
